package top.heliming.rabbitmq.rabbitmqdemo.work;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import top.heliming.rabbitmq.rabbitmqdemo.util.ConnectionUtil;

/**
 * description: //队列模式消费者
 *
 * @author: heliming
 * @date:2019/06/06 下午 10:34
 */
public class Recv2 {
  private final static String QUEUE_NAME = "test_work_queue";

  public static void main(String[] argv) throws Exception {
    // 获取到连接
    Connection connection = ConnectionUtil.getConnection();
    // 创建通道
    final Channel channel = connection.createChannel();
    // 声明队列
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//设置每个消费者同时只能处理一条消息（主要是在消费比较慢的消费者上加上就不会影响消费者快的消费消息）
    channel.basicQos(1);
    // 定义队列的消费者
    DefaultConsumer consumer = new DefaultConsumer(channel) {
      // 获取消息，并且处理，这个方法类似事件监听，如果有消息的时候，会被自动调用
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
          byte[] body) throws IOException {
        // body 即消息体
        String msg = new String(body);
        System.out.println(" [消费者2] received : " + msg + "!");
        try{
          //模拟完成任务耗时：1000ms
          Thread.sleep(1000);
        }catch (Exception e){

        }
        // 手动进行ACK
        channel.basicAck(envelope.getDeliveryTag(), false);
      }
    };
    // 监听队列，第二个参数false，手动进行ACK
    channel.basicConsume(QUEUE_NAME, false, consumer);
  }
}
